/**
《放学你别走》（第二季）
【Day1任务】
深入研究切片（slice）这一数据类型，理解切片和指针类型的区别和联系。熟练使用声明、创建、添加删除元素、复制等功能。
用学到的知识实现下面的题目：
使用切片数据类型（结合结构体）实现对客户信息的管理，且必需要使用到指针进行参数传递。
客户信息包含userName，userID，gender（1男 2女）。
管理内容包括：新增，查询（全部打印），删除（指定第几个元素），输出人员数量。
保证代码结构严谨，无报错，不崩溃。
 */
package main

import (
	"fmt"
	"os"
)

type User struct {
	UserName string
	UserId int
	Gender int
}

type List []*User


func main() {
	var List List

	for {
		var op string
		fmt.Printf("欢迎来到人员管理系统,当前用户有:%d人。", len(List))
		fmt.Println(" 1-添加人员 2-查看人员 3-删除人员 4-退出系统")
		fmt.Scan(&op)

		switch op {
		case "1":
			var user User
			List.queryAll()
			fmt.Println("请依次输入人员姓名 ID 性别 1-男,2-女")
			fmt.Scan(&user.UserName, &user.UserId, &user.Gender)
			if (user.Gender == 1 || user.Gender == 2) {
				List.add(&user)
			} else {
				fmt.Println(user.Gender)
				fmt.Println("性别输入错误")
			}
		case "2":
			List.queryAll()
		case "3":
			List.queryAll()
			var id int
			fmt.Println("请输入要删除的数据序号")
			fmt.Scan(&id)
			List.del(&id)
		case "4":
			os.Exit(0)
		default:
			fmt.Println("操作指令异常")
		}
		fmt.Println("----------------------------------------------------------------\n")
	}

}

func (list *List)add(user *User) {
	if len(*list) == 0 {
		*list = append(*list, user)
	} else {
		var exists bool = false
		for _, v := range *list{
			if (v.UserId == user.UserId) {
				exists = true
			}
		}
		if (exists) {
			fmt.Println("您添加的ID已存在")
		} else {
			*list = append(*list, user)
		}
	}

}

func (list *List)queryAll() {
	fmt.Printf("当前用户有:%d人:\n", len(*list))

	for k, v := range *list {
		var gender string = "男"
		if (v.Gender == 2) {
			gender = "女"
		}
		fmt.Printf("NO.%d 姓名:%s,Id:%d,性别:%s\n", k+1, (*v).UserName, (*v).UserId, gender)
	}
	fmt.Println("********************************************************************")
}

func (list *List)del(num *int) bool {
	if *num < 1 {
		fmt.Println("序号必须大于0")
		return false
	}
	if len(*list) < *num {
		fmt.Println("删除的数据不存在 1")
		return false
	} else {
		var exists bool = false
		for k, _ := range *list {
			if k == *num-1 {
				exists = true
			}
		}
		if (!exists) {
			fmt.Println("删除的数据不存在 2")
			return false
		} else {
			*list = append((*list)[:*num-1], (*list)[*num:]...)
			fmt.Println("删除成功")
			return true
		}
	}
}
